#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

//1.写出主函数
//100-500行代码
//如何执行呢？ - C语言是从主函数的第一行开始执行的
//所以C语言代码中得有main函数

//int main()
//{
//	printf("比特\n");
//	return 0;
//}

//int main()
//{
//	//字符类型
//	char ch = 'a';
//	//整型
//	int age = 20;
//	//短整型
//	short num = 10;
//	//长整型
//	long length = 100;
//	//单精度浮点型
//	float weight = 55.5;
//	//双精度浮点型
//	double d = 0.0;
//	return 0;
//}

//int main()
//{
//	//printf("%d\n", 100);//打印一个整数 - %d
//	//sizeof - 关键字 - 操作符 - 计算类型或着变量所占空间大小 - 单位是字节 byte
//	printf("%d\n", sizeof(char));
//	printf("%d\n", sizeof(short));
//	printf("%d\n", sizeof(int));
//	printf("%d\n", sizeof(long));
//	printf("%d\n", sizeof(long long));
//	printf("%d\n", sizeof(float));
//	printf("%d\n", sizeof(double));
//	return 0;
//}

//int main()
//{
//	int age = 20;
//	double weight = 75.3;
//
//	age = age + 1;
//	weight = weight - 10;
//	printf("%d\n", age);
//	printf("%lf\n", weight);
//	return 0;
//}

//全局变量 - ()外部定义
//int a = 100;

//int main()
//{
//	//局部变量 - ()内部定义
//	int a = 10;
//	printf("%d\n", a);
//	//局部优先
//	//不建议全局变量和局部变量名字一样
//	return 0;
//}

//写代码求两个整数的和

//int main()
//{
//	int a = 0;
//	int b = 0;
//	int sum = 0;
//	scanf("%d %d", &a, &b);
//	sum = a + b;
//	printf("sum=%d\n", sum);
//	return 0;
//}

//变量的作用域
//1.局部变量 - 变量所在的局部范围
//2.全局变量 - 整个工程

//变量生命周期
//1.局部变量 - 进入作用域生命周期开始，出作用域生命周期结束
//2.全局变量 - 整个程序的生命周期

//extern a;
//
//void test()
//{
//	printf("test-->%d\n", a);
//}
//
//int main()
//{
//	test();
//	{
//		printf("a=%d\n", a);
//	}
//	printf("a=%d\n", a);
//	return 0;
//}

//1.字面常量
//2.const修饰的常变量
//3.define定义的标识符常量
//4.枚举常量

//int main()
//{
//	//const int a = 10;
//	//const修饰的a本质是变量，但是不能被修改，有常量的属性
//	//a = 20;
//	//printf("%d\n", a);
//
//	const int n = 10;
//	int arr[n] = { 0 };
//	return 0;
//}

//#define MAX 100
//#define STR "abcdef"
//int main()
//{
//	printf("%d\n", MAX);
//	int a = MAX;
//	printf("%d\n", a);
//	printf("%s\n", STR);
//	return 0;
//}

//枚举常量，Color是类型，RGB是常量
//enum Color
//{
//	//枚举常量
//	RED,
//	GREEN,
//	BLUE
//};
//int main()
//{
//	enum Color c = RED;
//	printf("%d %d %d", RED, GREEN, BLUE);
//	return 0;
//}

//int main()
//{
//	//char 字符类型
//	//'a';
//	//char ch='w';
//	//字符串
//	//C语言中没有字符串类型
//	//"abcdef"
//
//	char arr1[] = "abcdef";
//	char arr2[] = { 'a','b','c','d','e','f' ,'\\','0','\0'};
//
//	int len1=strlen(arr1);//求字符串长度的函数,string lenth，不包含'\0'
//	int len2=strlen(arr2);
//	printf("%d\n", len1);
//	printf("%d\n", len2);
//	printf("%s\n", arr1);
//	printf("%s\n", arr2);
//
//	return 0;
//}

//int main()
//{
//	//printf("abc\0def");
//	//printf("%c\n", '\'');
//	//printf("\"");
//	//printf("abc\\0def");
//	//printf("c:\\test\\test.c");
//	//printf("\a");
//	//printf("%c\n", '\130');
//	//printf("%c\n", '\x63');
//	printf("%d\n", strlen("c:\test\628\test.c"));
//	return 0;
//}

//int main()
//{
//	//int a = 10;
//
//	//C语言早期注释方式，缺陷：不支持嵌套注释
//	/*int a = 10;
//	int b = 20;*/
//
//	//创建指针变量p，并赋值为NULL
//	int* p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int input = 0;
//	printf("加入比特\n");
//	printf("要好好学习吗(1/0)?");
//	scanf("%d", &input);
//
//	if (input == 1)
//	{
//		printf("找个好offer\n");
//	}
//	else
//	{
//		printf("回家卖红薯\n");
//	}
//	return 0;
//}

//int main()
//{
//	int line = 0;
//	printf("加入比特\n");
//
//	while (line < 20000)
//	{
//		printf("写代码：%d\n", line);
//		line++;
//	}
//	if (line >= 20000)
//	{
//		printf("拿个好offer\n");
//	}
//	else
//	{
//		printf("继续加油\n");
//	}
//	return 0;
//}

////函数
//int Add(int x, int y)
//{
//	//int z = 0;
//	//z = x + y;
//	//return z;
//	return x + y;
//}
//
//int main()
//{
//	int n1 = 0;
//	int n2 = 0;
//	//输入
//	scanf("%d %d", &n1, &n2);
//	//求和
//	//int sum=n1+n2;
//	int sum = Add(n1, n2);
//	//打印
//	printf("%d\n", sum);
//	return 0;
//}

//数组
//int main()
//{
//	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
//	char ch[5];
//	double d[30];
//
//	//0~9
//	//printf("%d\n", arr[8]);
//	int i = 0;
//	while (i <= 9)
//	{
//		printf("%d ", arr[i]);
//		i++;
//	}
//
//	return 0;
//}

//int main()
//{
//	//int a = 7 / 2;
//	//int b = 7 % 2;//取模
//	//除号两端都是整数的时候，执行的是整数除法，如果两端只要有一个浮点数就执行浮点数除法
//	float a = 7.0 / 2;
//	int b = 7 % 2.0;//错误
//	//取模操作符的两个操作数只能是整数
//
//	printf("%.1f\n", a);
//	printf("%d\n", b);
//	
//	return 0;
//}

//int main()
//{
//	//int a = -10;
//	//int b = !a;
//	//printf("%d\n", b);
//
//	//sizeof是单目操作符，不是函数
//	//int a = 10;
//	//printf("%d\n", sizeof(a));//4
//	//printf("%d\n", sizeof(int));//4
//	//printf("%d\n", sizeof a);//4
//	//printf("%d\n", sizeof int);//报错
//
//	//int arr[10] = { 0 };
//	//printf("%d\n", sizeof(arr));//40 计算的是整个数组的大小，单位是字节
//	//printf("%d\n", sizeof(arr[0]));//4 一个元素的字节数
//	//printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 - 数组的元素个数
//
//	//int a = 10;
//	//int b = a++;//后置++，先使用，后++
//	//printf("%d\n", b);//10
//	//printf("%d\n", a);//11
//
//	//int c = 10;
//	//int d = ++c;//前置++，先++，后使用
//	//printf("%d\n", d);//11
//	//printf("%d\n", c);//11
//
//	//int a = (int)3.14;
//	//printf("%d\n", a);
//	////3.14 字面浮点数，编译器默认理解为double类型
//
//	//int a = 10;
//	//if (a = 3)//这是赋值，应该用==才对
//	//	printf("ok\n");
//
//	//&& 逻辑与 - 并且
//	//|| 逻辑或 - 或者
//	//int a = 0;
//	//int b = 20;
//	//if (a || b)
//	//	printf("ok\n");
//
//	int a = 10;
//	int b = 20;
//	int r = a > b ? a : b;
//	printf("%d\n", r);
//	//求两数较大值，用三目操作符 ? ;
//
//	return 0;
//}

//逗号表达式就是逗号隔开的一串表达式
//逗号表达式的特点是：从左向右依次计算，整个表达式的结果是最后一个表达式的结果
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 0;
//	int d = (c = a - 2, a = b + c, c - 3);
//	printf("%d\n", d);
//
//	return 0;
//}

//下标引用操作符
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9.10 };
//	int n = 3;
//	arr[n] = 20;//[]就是下标引用操作符，arr和3是[]的操作数
//
//	return 0;
//}

//函数调用操作符
//int Add(int x, int y)
//{
//	return x + y;
//}

//int main()
//{
//	in sum = Add(2, 3);//()就是函数调用操作符，Add,2,3都是()的操作数
//	printf("%d\n", sum);
//
//	return 0;
//}

//typedef unsigned int uint;
//
//int main()
//{
//	unsigned int mun1 = 0;
//	uint num2 = 0;
//	printf("%d\n", num2);
//
//	return 0;
//}

//static
//1.修饰局部变量
//2.修饰全局变量
//3.修饰函数

//修饰局部变量
//void test()
//{
//	static int a = 1;//不销毁a
//	a++;
//	printf("%d ", a);
//}
//
//int main()
//{
//	int i = 0;
//	while (i < 10)
//	{
//		test();
//		i++;
//	}
//	return 0;
//}

//修饰全局变量

//声明外部符号
//extern int g_val1;
//extern int g_val2;
//
//int main()
//{
//	printf("%d\n", g_val1);
//	printf("%d\n", g_val2);
//
//	return 0;
//}

//修饰函数

//extern int Add(int x, int y);
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int z = Add(a,b);
//	printf("%d\n", z);
//
//	return 0;
//}

//define定义标识符常量
//#define NUM 100 

//define定义宏
//宏是有参数
//#define ADD(x,y) ((x)+(y))

//int main()
//{
//	//int arr[NUM] = { 0 };
//
//	int a = 10;
//	int b = 20;
//	int c = ADD(a, b);
//	printf("%d\n", c);
//
//	return 0;
//}

//int main()
//{
//	int a = 10;//向内存申请4个字节，存储10
//	&a;//取地址操作符
//	printf("%p\n", &a);//%p是打印地址的符号,以十六进制表示
//	int* p = &a;
//	//p就是指针变量
//	*p = 20;//解引用操作符，意思就是通过p中存放的地址，找到p所指向的对象，*p就是p指向的对象
//	printf("%d\n", a);
//
//	//char ch = 'w';
//	//char* pc = &ch;
//
//	return 0;
//}

//int main()
//{
//	int* p;
//	char* p2;
//	//不管是什么类型的指针，都是在创建指针变量
//	//指针变量是用来存放地址的
//	//指针变量的大小取决于一个地址存放的时候需要多大空间
//	//32位机器上的地址：32bit位 - 4byte，所以指针变量的大小是4个字节
//	//64位机器上的地址：64bit位 - 8byte，所以指针变量的大小是8个字节
//
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(float*));
//	printf("%zd\n", sizeof(double*));
//}

//int main()
//{
//	char* pc;
//	int* p;
//
//	int* p1; *p2; *p3;//每个p都需要一个*才会定义为指针变量，不然p2和p3会被定义为int整型变量
//
//	return 0;
//}

//学生，这是图纸，定义了一种结构体类型，并没有开辟空间
//struct Stu
//{
//	//成员
//	char name[20];
//	int age;
//	char sex[10];
//	char tele[12];
//};
//
//void print(struct Stu* ps)
//{
//	printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
//	//->
//	//结构体指针变量->成员名
//	printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);
//};
//
//void printe(struct Stu pe)
//{
//	struct Stu* pa = &pe;	
//	printf("%s %d %s %s\n", pa->name, pa->age, pa->sex, pa->tele);
//};
//
//int main()
//{
//	//这里是按照图纸盖房子，开辟空间存放结构体变量s
//	struct Stu s = { "zhangsan",20,"nan","19911478756" };
//	
//	//结构体对象.成员名
//	//printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
//	//print(&s);
//	printe(s);
//
//	return 0;
//}
// 
//int main()
//{
//	int a = 0;
//	if (a = 0) //这里是错误的，判断符号==被写成了赋值符号=，因为if括号内为0是假，所以不会输出haha
//		printf("haha\n");
//
//	return 0;
//}

//int main()
//{
//	int num = 3;
//	if (5 == num) //反过来写是个好习惯，把错误拦截在编译器
//		printf("haha\n");
//
//	return 0;
//}

//int main()
//{
//	//判断一个数是否为奇数
//	int num = 0;
//	scanf("%d", &num);
//	if (num % 2 == 1)
//		printf("奇数\n");
//	else
//		printf("不是\n");
//
//	return 0;
//}

//int main()
//{
//	for (int num = 0; num <= 100; num++)
//	{
//		if (num % 2 == 1)
//			printf("%d\n", num);
//	}
//
//	return 0;
//}

//int main()
//{
//	int day = 0;
//	// float day = 0;
//	scanf("%d", &day);
//	switch (day) //括号里只能是整型表达式
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5:
//		printf("weekday\n");
//		break;
//	case 6:
//	case 7:
//		printf("weekend\n");
//		break;
//	default:
//		printf("输入错误\n");
//		break;
//	}
//
//	return 0;
//}

//int main()
//{
//	int n = 1;
//	int m = 2;
//	switch (n)
//	{
//	case 1:m++;
//	case 2:n++;
//	case 3:
//		switch (n)
//		{//switch语句允许嵌套使用
//		case 1:n++;
//		case 2:m++; n++;
//			break;
//		}
//	case 4:
//		m++;
//		break;
//	default:
//		break;
//	}
//	printf("m = %d, n = %d\n", m, n);
//
//	return 0;
//}


//while循环中的
//break是用于永久的终止循环
//continue跳过本次循环后面的代码，直接去判断部分，进行下一次循环的判断
//
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		i++;
//		if (5 == i)
//			continue;
//
//		printf("%d ", i);
//	}
//
//	return 0;
//}

//难点案例
//假设密码是一个字符串
//int main()
//{
//	char password[20] = { 0 };
//	printf("请输入密码:>");
//	scanf("%s", password);
//
//	//getchar();//读取了\n
//	int ch = 0;
//	while ((ch = getchar()) != '\n')
//	{
//		;
//	}
//
//	printf("请输入密码(Y/N):>");
//	int ret = getchar();
//	if ('Y' == ret)
//		printf("Yes\n");
//	else
//		printf("No\n");
//
//	return 0;
//}

//int main()
//{
//	char ch = '\0';
//	while ((ch = getchar()) != EOF)
//	{
//		if (ch < '0' || ch > '9')
//			continue;
//		putchar(ch);
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[20] = { 73,32,99,97,110,32,100,111,32,105,116,33 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//sizeof(arr) - 计算的是数组的总大小，单位是字节
//	//sizeof(arr[0]) - 计算的是数组元素的大小
//	//sizeof(arr)/sizeof(arr[0]) - 数组元素个数
//
//	for (i = 0; i < sz; i++)
//		printf("%c ", arr[i]);
//
//	return 0;
//}

//int main()
//{
//	int y = 0;
//	int m = 0;
//	int d = 0;
//	scanf("%4d%2d%2d", &y, &m, &d);
//
//	printf("year=%d\n", y);
//	printf("month=%02d\n", m);//有0用0补位，无0用空格补位
//	printf("day=%02d\n", d);
//
//	return 0;
//
//}

//int main()
//{
//	int id = 0;
//	float a = 0.0f;
//	float b = 0.0f;
//	float c = 0.0f;
//  //0.0默认是double类型
//	scanf("%d;%f,%f,%f", &id, &a, &b, &c);
//	if (id >= 1 && id <= 20000000)
//		printf("The each subject score of No.%d is %.2f,%.2f,%.2f\n", id, a, b, c);
//	else
//		printf("error!\n");
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	a=printf("Hello world!");
//	printf("\n%d\n", a);
//
//	return 0;
//}

//int main()
//{
//	printf("printf(\"Hello world!\\n\");\n");
//	printf("cout<<\"Hello world!\"<<endl;\n");
//	return 0;
//}

//int main()
//{
//	int x = 0;
//	int n = 0;
//	scanf("%d",&x);
//	for (int i = 1; i < 4; i++)
//	{
//		scanf("%d", &n);
//		if (x < n)
//			x = n;
//	}
//	printf("%d\n", x);
//
//	return 0;
//}

//int main()
//{
//	double r = 0.0;
//	double v = 0.0;
//
//	scanf("%lf", &r);
//	v = 4 / 3.0 * 3.1415926 * r * r * r;
//	printf("%.3lf\n", v);
//
//	return 0;
//}

//int main()
//{
//	int w = 0;
//	int h = 0;
//	float BMI = 0.0f;
//	scanf("%d %d", &w, &h);
//	BMI = w / (h/100.0) / (h/100.0);
//	printf("%.2f", BMI);
//
//	return 0;
//}

//int main()
//{
//	for (int i = 1; i <= 10; i++) //C99语法才支持了这种写法，C++中支持这种写法
//		printf("%d ", i);
//	
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	//前闭后开的写法
//	for(i = 0; i < 10; i++)
//	{ }
//
//	//两边都是闭区间
//	for (i = 0; i <= 9; i++)
//	{ }
//
//	return 0;
//}

//int main()
//{
//	//for循环的判断部分省略意味着判断会恒成立
//	for (;;)
//		printf("hehe\n");
//
//	return 0;
//}
//
//int main()
//{
//	int i = 0;
//	int j = 0;
//	
//	//不要随意省略for内容
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 3; j++)
//		{
//			printf("hehe\n");
//		}
//	}
//
//	for (; i < 3; i++)
//	{
//		for (; j < 3; j++)
//		{
//			printf("hehe\n");
//		}
//	}
//
//	return 0;
//}

//男女比例问题
//int random()
//{
//	int num = 0;
//	num = rand() % 2;
//	return num;
//}
//
//int main()
//{	
//	int math = 0;
//	int people = 0;
//	int i = 0;
//	int morf = 0;
//	srand((unsigned)time(NULL));
//
//	for (i = 0; i < 100000000; i++)
//	{
//		do
//		{
//			people++;
//			morf = random();
//		} while (morf == 0);
//		math++;
//	}
//	printf("男生人数：%d\n女生人数: %d\n", math, (people-math));
//
//	return 0;
//}

#include<windows.h>
#include<stdlib.h>

//int main()
//{
//	int a = 0;
//	int i = 0;
//	int n = 0;
//	scanf("%d", &n);
//	for (i = 1, a = 1; i <= n; i++)
//	{
//		a = a * i;
//	}
//	printf("%d的阶乘是：%d\n", n,a);
//
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	int n = 0;
//	int ret = 1;
//	scanf("%d", &n);
//	for (i = 1; i <= n; i++)
//	{
//		ret = ret * i;
//	}
//	printf("%d的阶乘是：%d\n", n, ret);
//
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	int n = 0;
//	int ret = 1;
//	int sum = 0;
//	scanf("%d", &n);
//	for (i = 1; i <= n; i++)
//	{
//		ret = ret * i;
//		sum += ret;
//	}
//	printf("从1到%d的阶乘之和是：%d\n", n,sum);
//
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//
//	printf("请输入要找的数：");
//	scanf("%d", &k);
//
//	//在一个有序数组中查找某个具体的数字n
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	int left = 0;
//	int right = sz - 1;
//
//	while(left<=right)
//	{ 
//		int mid = (left + right) / 2;
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是：%d\n", mid);
//			break;
//		}
//	}
//	if (left > right)
//	{
//		printf("找不到\n");
//	}
//
//	return 0;
//}

//int main()
//{
//	char arr1[] = "welcome to bit!!!!";
//	char arr2[] = "##################";
//
//	int left = 0;
//	int right = strlen(arr2) - 1;//int right = sizeof(arr2)/sizeof(arr2[0])-2;
//
//	while (left <= right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);
//		//清空屏幕
//
//		system("cls");//system是一个库函数，可以执行系统命令
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);
//
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	char password[20] = {"yxfzs"};
//	char check[20] = { 0 };
//
//	//比较两个字符串是否相等，不能使用==，而应该使用一个库函数：strcmp
//	//如果返回值是0，表示两个字符串相等
//
//	for (i = 0; i < 3; i++)
//	{	
//		printf("请输入密码:>");
//		scanf("%s", check);
//		if (strcmp(password,check)==0)
//		{
//			printf("登录成功\n");
//			break;
//		}
//		else
//		{
//			printf("登录失败，请重试（剩余%d次）\n", (2 - i));
//		}
//	}
//	if(i==3)
//		printf("登陆失败，次数已经用尽\n");
//
//	return 0;
//}